{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Optional Lab: Feature Engineering and Polynomial Regression\n",
    "\n",
    "![](./images/C1_W2_Lab07_FeatureEngLecture.PNG)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Goals\n",
    "In this lab you will:\n",
    "- explore feature engineering and polynomial regression which allows you to use the machinery of linear regression to fit very complicated, even very non-linear functions.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Tools\n",
    "You will utilize the function developed in previous labs as well as matplotlib and NumPy. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from lab_utils_multi import zscore_normalize_features, run_gradient_descent_feng\n",
    "np.set_printoptions(precision=2)  # reduced display precision on numpy arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "<a name='FeatureEng'></a>\n",
    "# Feature Engineering and Polynomial Regression Overview\n",
    "\n",
    "Out of the box, linear regression provides a means of building models of the form:\n",
    "$$f_{\\mathbf{w},b} = w_0x_0 + w_1x_1+ ... + w_{n-1}x_{n-1} + b \\tag{1}$$ \n",
    "What if your features/data are non-linear or are combinations of features? For example,  Housing prices do not tend to be linear with living area but penalize very small or very large houses resulting in the curves shown in the graphic above. How can we use the machinery of linear regression to fit this curve? Recall, the 'machinery' we have is the ability to modify the parameters $\\mathbf{w}$, $\\mathbf{b}$ in (1) to 'fit' the equation to the training data. However, no amount of adjusting of $\\mathbf{w}$,$\\mathbf{b}$ in (1) will achieve a fit to a non-linear curve.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "<a name='PolynomialFeatures'></a>\n",
    "## Polynomial Features\n",
    "\n",
    "Above we were considering a scenario where the data was non-linear. Let's try using what we know so far to fit a non-linear curve. We'll start with a simple quadratic: $y = 1+x^2$\n",
    "\n",
    "You're familiar with all the routines we're using. They are available in the lab_utils.py file for review. We'll use [`np.c_[..]`](https://numpy.org/doc/stable/reference/generated/numpy.c_.html) which is a NumPy routine to concatenate along the column boundary."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration         0, Cost: 1.65756e+03\n",
      "Iteration       100, Cost: 6.94549e+02\n",
      "Iteration       200, Cost: 5.88475e+02\n",
      "Iteration       300, Cost: 5.26414e+02\n",
      "Iteration       400, Cost: 4.90103e+02\n",
      "Iteration       500, Cost: 4.68858e+02\n",
      "Iteration       600, Cost: 4.56428e+02\n",
      "Iteration       700, Cost: 4.49155e+02\n",
      "Iteration       800, Cost: 4.44900e+02\n",
      "Iteration       900, Cost: 4.42411e+02\n",
      "w,b found by gradient descent: w: [18.7], b: -52.0834\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create target data\n",
    "x = np.arange(0, 20, 1)\n",
    "y = 1 + x**2\n",
    "X = x.reshape(-1, 1)\n",
    "\n",
    "model_w,model_b = run_gradient_descent_feng(X,y,iterations=1000, alpha = 1e-2)\n",
    "\n",
    "plt.scatter(x, y, marker='x', c='r', label=\"Actual Value\"); plt.title(\"no feature engineering\")\n",
    "plt.plot(x,X@model_w + model_b, label=\"Predicted Value\");  plt.xlabel(\"X\"); plt.ylabel(\"y\"); plt.legend(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Well, as expected, not a great fit. What is needed is something like $y= w_0x_0^2 + b$, or a **polynomial feature**.\n",
    "To accomplish this, you can modify the *input data* to *engineer* the needed features. If you swap the original data with a version that squares the $x$ value, then you can achieve $y= w_0x_0^2 + b$. Let's try it. Swap `X` for `X**2` below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# create target data\n",
    "x = np.arange(0, 20, 1)\n",
    "y = 1 + x**2\n",
    "\n",
    "# Engineer features \n",
    "X = x**2      #<-- added engineered feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration         0, Cost: 7.32922e+03\n",
      "Iteration      1000, Cost: 2.24844e-01\n",
      "Iteration      2000, Cost: 2.22795e-01\n",
      "Iteration      3000, Cost: 2.20764e-01\n",
      "Iteration      4000, Cost: 2.18752e-01\n",
      "Iteration      5000, Cost: 2.16758e-01\n",
      "Iteration      6000, Cost: 2.14782e-01\n",
      "Iteration      7000, Cost: 2.12824e-01\n",
      "Iteration      8000, Cost: 2.10884e-01\n",
      "Iteration      9000, Cost: 2.08962e-01\n",
      "w,b found by gradient descent: w: [1.], b: 0.0490\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = X.reshape(-1, 1)  #X should be a 2-D Matrix\n",
    "model_w,model_b = run_gradient_descent_feng(X, y, iterations=10000, alpha = 1e-5)\n",
    "\n",
    "plt.scatter(x, y, marker='x', c='r', label=\"Actual Value\"); plt.title(\"Added x**2 feature\")\n",
    "plt.plot(x, np.dot(X,model_w) + model_b, label=\"Predicted Value\"); plt.xlabel(\"x\"); plt.ylabel(\"y\"); plt.legend(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Great! near perfect fit. Notice the values of $\\mathbf{w}$ and b printed right above the graph: `w,b found by gradient descent: w: [1.], b: 0.0490`. Gradient descent modified our initial values of $\\mathbf{w},b $ to be (1.0,0.049) or a model of $y=1*x_0^2+0.049$, very close to our target of $y=1*x_0^2+1$. If you ran it longer, it could be a better match. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### Selecting Features\n",
    "<a name='GDF'></a>\n",
    "Above, we knew that an $x^2$ term was required. It may not always be obvious which features are required. One could add a variety of potential features to try and find the most useful. For example, what if we had instead tried : $y=w_0x_0 + w_1x_1^2 + w_2x_2^3+b$ ? \n",
    "\n",
    "Run the next cells. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# create target data\n",
    "x = np.arange(0, 20, 1)\n",
    "y = x**2\n",
    "\n",
    "# engineer features .\n",
    "X = np.c_[x, x**2, x**3]   #<-- added engineered feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration         0, Cost: 1.14029e+03\n",
      "Iteration      1000, Cost: 3.28539e+02\n",
      "Iteration      2000, Cost: 2.80443e+02\n",
      "Iteration      3000, Cost: 2.39389e+02\n",
      "Iteration      4000, Cost: 2.04344e+02\n",
      "Iteration      5000, Cost: 1.74430e+02\n",
      "Iteration      6000, Cost: 1.48896e+02\n",
      "Iteration      7000, Cost: 1.27100e+02\n",
      "Iteration      8000, Cost: 1.08495e+02\n",
      "Iteration      9000, Cost: 9.26132e+01\n",
      "w,b found by gradient descent: w: [0.08 0.54 0.03], b: 0.0106\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model_w,model_b = run_gradient_descent_feng(X, y, iterations=10000, alpha=1e-7)\n",
    "\n",
    "plt.scatter(x, y, marker='x', c='r', label=\"Actual Value\"); plt.title(\"x, x**2, x**3 features\")\n",
    "plt.plot(x, X@model_w + model_b, label=\"Predicted Value\"); plt.xlabel(\"x\"); plt.ylabel(\"y\"); plt.legend(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Note the value of $\\mathbf{w}$, `[0.08 0.54 0.03]` and b is `0.0106`.This implies the model after fitting/training is:\n",
    "$$ 0.08x + 0.54x^2 + 0.03x^3 + 0.0106 $$\n",
    "Gradient descent has emphasized the data that is the best fit to the $x^2$ data by increasing the $w_1$ term relative to the others.  If you were to run for a very long time, it would continue to reduce the impact of the other terms. \n",
    ">Gradient descent is picking the 'correct' features for us by emphasizing its associated parameter\n",
    "\n",
    "Let's review this idea:\n",
    "- Intially, the features were re-scaled so they are comparable to each other\n",
    "- less weight value implies less important/correct feature, and in extreme, when the weight becomes zero or very close to zero, the associated feature useful in fitting the model to the data.\n",
    "- above, after fitting, the weight associated with the $x^2$ feature is much larger than the weights for $x$ or $x^3$ as it is the most useful in fitting the data. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### An Alternate View\n",
    "Above, polynomial features were chosen based on how well they matched the target data. Another way to think about this is to note that we are still using linear regression once we have created new features. Given that, the best features will be linear relative to the target. This is best understood with an example. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# create target data\n",
    "x = np.arange(0, 20, 1)\n",
    "y = x**2\n",
    "\n",
    "# engineer features .\n",
    "X = np.c_[x, x**2, x**3]   #<-- added engineered feature\n",
    "X_features = ['x','x^2','x^3']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 864x216 with 3 Axes>",
      "image/png": "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dsaBROCKO9her1eBQOv5HYFAQGlpaRH/jEjuPEe6qwd3poHo+mOu9K+j0uffe4dpcKr05g0014DTtJfXP+baVxNgN1c02FlZWWpubtZnn32mESNGSJLKysoiXuAo0TwDbjI8PdhMs4Ul4HzkFWjLY4wxdhcRienTp8vj8aioqEilpaWaPHmydu/e3arJrqv77jmtp08pARKRkzPh5NoAOzg5E06uDbBDR5lwxRxsSXrsscfU1NSkH/3oR7rlllu0Zs2aTt3BBgAAAGLBNXewI/H93yYAtOa0u07kFWgfeQXcw9V3sAEAAAA3oMEGAAAALBRXU0QAAAAAu3EHGwAAALAQDTYAAABgIRpsAAAAwEIJ02AfO3ZMU6ZMUWpqqoYOHapnnnnG7pI65corr1RycrK8Xq+8Xq8uuOACu0sKa/Xq1RozZoySkpKUn5/f6tiOHTuUnZ2tlJQUTZgwQVVVVfYUeQbt1X/o0CF5PJ7Q//9er1fLly+3r9AE4IbMnu31bozR4sWLlZGRoYyMDBUUFMiu5TAnTpzQnDlzNHToUKWlpeniiy/Wq6++GjrulvOQpLy8PPXv31/p6enKyspSUVFR6JibzsONnJ7XaF7nhw4d0oQJE5SSkqLs7Gxt3749puf22WefKTk5WXl5ea4/n40bN+rCCy9UamqqMjMztWvXLveej0kQ06dPNzfffLOpr683u3btMunp6Wbv3r12lxWx8ePHmyeeeMLuMjpUXFxsXnzxRTNv3jwze/bs0PiXX35p0tPTzfPPP2+amprMr3/9azN27Fj7Cm1He/VXVlYaSebkyZP2FZdg3JDZs73eH3/8cZOVlWU+//xzU11dbS688EKzZs0aG87AmIaGBrN06VJTWVlpWlpazNatW43X6zWVlZWuOg9jjNm7d685fvy4McaYffv2mb59+5r333/fdefhRk7PazSv85/85Cfm7rvvNv/973/Npk2bjM/nM0eOHInZuU2aNMnk5uaaGTNmGGO6/vpj1/ls27bNDBkyxLz77rumpaXFVFdXm+rqateeT0I02A0NDaZHjx7m008/DY3l5eWZxYsX21hV57ilwf7WAw880KrhWLt2rbn00ktDnzc0NJjk5GSzb98+G6rr2On102DHltsy29nr/dJLLzVr164NHS8qKnLUL5yjRo0ymzZtcvV57N+/3/Tr188899xzrj4PN3BbXr9lxXX+6aefmp49e5pAIBA6npubG7Nf0J599llz0003maVLl4YabLeez6WXXmqKiorajLv1fBJiisiBAwfUrVs3ZWVlhcZycnJUXl5uY1Wdd99996lPnz66/PLLtXPnTrvL6ZTy8nLl5OSEPv/27R+3/R0MHTpUgwYN0q233qqjR4/aXU7ccntmO7reTz/upHOrra3VgQMH5Pf7XXked955Z+it4P79+2vy5MmuPA83cWNerbrOy8vLdd555yktLS3s8WgKBAL67W9/q5UrV7Yad+P5tLS06P3339eXX36p888/X4MGDdKCBQvU1NTkyvOREmQOdkNDQ5vHWPp8PtXX19tUUec9/PDDOnjwoGpqanTHHXfo2muvVUVFhd1lRcztfwd9+vTRP//5T1VVVemDDz5QfX29ZsyYYXdZccvt10tH9Z9+3OfzqaGhwfZ5vydPntSMGTM0e/ZsZWdnu/I8HnvsMdXX12vXrl2aOnWqkpKSXHkebuK2vFp5ndt57oWFhZozZ44GDx7catyN51NbW6uTJ09q06ZN2rVrl0pLS/Xhhx9qxYoVrjwfKUEabK/Xq0Ag0GosEAi0+o3G6caOHau0tDQlJSVp9uzZuvzyy/XKK6/YXVbE3P534PV6NWbMGHXv3l19+/bV6tWrtW3btjbnBGvEw/VypvpPPx4IBOT1euXxeGJa5/edOnVKM2fOVM+ePbV69WpJ7jwPSerWrZtyc3NVXV2tNWvWuPY83MJNebX6Orfr3EtLS7V9+3bdfffdbY658Xx69eolSVq4cKH69++vPn366J577tErr7ziyvOREqTBzsrKUnNzsz777LPQWFlZmfx+v41VdY3H43HV3RW/36+ysrLQ542NjaqoqHDt38G3//C66e/ATdye2Y6u99OP231uxhjNmTNHtbW1Ki4uVo8ePSS57zxO19zcHKrXzefhdG7JazSuc7/fr4MHD7a6IxqLc9+5c6cOHTqkIUOGqF+/fnrkkUdUXFysH//4x648n969e2vQoEFhf6l14/lISpxdRKZNm2amT59uGhoazNtvv+24Fc5n8vXXX5vXXnvNNDU1mZMnT5oNGzaYlJQUs3//frtLa+PkyZOmqanJ/OY3vzF5eXmhmo8cOWLS09PNpk2bTFNTkykoKHDkIqL26t+zZ4/Zv3+/aWlpMUePHjU333yzufLKK+0uN665IbNne72vWbPGZGdnm+rqalNTU2NGjhxp664Vc+fONWPHjjX19fWtxt10HrW1tebZZ5819fX1prm52bz22msmJSXFbNmyxVXn4VZuyGu0rvOxY8eaRYsWmaamJrN58+aY7FLR2Nhovvjii9CfRYsWmRtvvNEcOXLEledjjDGFhYVmzJgxpra21hw7dszk5uaaJUuWuPZ8EqbB/uqrr8z1119vUlJSzODBg83TTz9td0kRO3LkiBkzZozxer3G5/OZsWPHmm3bttldVlhLly41klr9Wbp0qTHGmDfeeMNccMEFJjk52YwfP95UVlbaWms47dX/zDPPmGHDhpmUlBTTr18/M3PmTPPFF1/YXW5cc0Nmz/Z6P3XqlLn33ntN7969Te/evc29995rTp06Zcs5HDp0yEgySUlJJjU1NfRnw4YNrjqPI0eOmHHjxhmfz2fS0tLMRRddZNatWxc67pbzcCun5zWa13llZaUZP368SU5ONllZWeaNN96I9em12kXEGHeez//+9z8zf/584/P5TN++fc3ChQtNU1OTa8/HYwzvcQMAAABWSYg52AAAAECs0GADAAAAFqLBBgAAACxEgw0AAABYiAYbAAAAsBANNgAAAGAhGmwASEDGGOXn58vj8ejGG29US0uL3SUBaAd5dR8abABIQAsWLNBLL72koqIivfPOO8rPz9fpj0X4+OOPNXPmTA0bNkzJyckaPny47rrrLv3nP/+xp2ggQUWS16amJl1zzTUaMmSIkpOT1bdvX91www365JNPbKo6sdFgA0CCKSgo0JYtW/TWW29pzpw5evvtt/XOO+9o/vz5rb7uX//6l7xer4qKivTJJ5/o8ccf19atW3XLLbfYVDmQeCLNq8fj0aRJk/T888/r008/1T/+8Q81Nzfrqquu0vHjx22qPoHF5HmRiHtHjx41gwYNMr/61a9CY7W1taZfv36moKDAxsqAxBFJDh966CEzYsSIVo8aNsaYw4cPm1GjRpl77rnnjP8bmzZtMh6Px9TV1VleP5BIYpHX0tJSI8mUlpZaXj/OjEelwzJvvfWWrrrqKm3evFnXXHONfv7zn6uurk67du1Sjx497C4PSAjRzuHf/vY3LVy4UHV1derevbsFFQOJK5p5ra+v1/33368XX3xRBw4cUEpKikVVIxK8OsIy48aN05IlS3Trrbdq9uzZeu+99/Thhx/SXAMxFM0c/vvf/9bSpUs1f/58mmvAAtHI6+LFi/WXv/xFjY2Nys7O1s6dO2mubcAdbFjq1KlTys3N1bvvvquNGzdq2rRpdpcEJJxo5PDIkSOaOHGiBg8erC1btvCLM2ARq/N69OhRff3116qpqdEjjzyiqqoq7d69W2lpaRZVjEiwyBGW+uKLL3TgwAF169ZNBw4csLscICFZncPq6mqNHz9eQ4cO1ebNm2muAQtZndc+ffpoxIgRuvLKK7V582YdOnRITz/9tAWVojNosGGZU6dOKS8vT36/X5s2bdKyZcv09ttv210WkFCszmFFRYWuuOIKjRw5Ups3b1ZSUpKF1QKJLRb/bhpjdOLECUt/JjrGJDpY5ne/+50+/vhjlZaWatCgQZo3b55mzJih0tJS9e7d2+7ygIRgZQ4/+eQTTZw4UaNHj9af//xnffXVV6Fj5557rrp162Z1+UBCsTKvO3fu1L59+3TZZZepd+/e+vzzz/Xwww/rnHPO0ZQpU6J0BmgPc7Bhid27d2v8+PEqLi7WddddJ0k6ceKELrnkEp1//vkqLi62uUIg/lmdwwcffFAPPfRQ2GOVlZUaNmxYV0sGEpbVeX3vvfdUUFCgvXv3qqGhQf369dMVV1yh+++/XyNHjozGKeAMaLABAAAACzEHGwAAALAQDTYAAABgIRpsAAAAwEI02AAAAICFaLABAAAAC9FgAwAAABaiwQYAAAAsRIMNAAAAWOj/A18jKDmhG40aAAAAAElFTkSuQmCC\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig,ax=plt.subplots(1, 3, figsize=(12, 3), sharey=True)\n",
    "for i in range(len(ax)):\n",
    "    ax[i].scatter(X[:,i],y)\n",
    "    ax[i].set_xlabel(X_features[i])\n",
    "ax[0].set_ylabel(\"y\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Above, it is clear that the $x^2$ feature mapped against the target value $y$ is linear. Linear regression can then easily generate a model using that feature."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### Scaling features\n",
    "As described in the last lab, if the data set has features with significantly different scales, one should apply feature scaling to speed gradient descent. In the example above, there is $x$, $x^2$ and $x^3$ which will naturally have very different scales. Let's apply Z-score normalization to our example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Peak to Peak range by column in Raw        X:[  19  361 6859]\n",
      "Peak to Peak range by column in Normalized X:[3.3  3.18 3.28]\n"
     ]
    }
   ],
   "source": [
    "# create target data\n",
    "x = np.arange(0,20,1)\n",
    "X = np.c_[x, x**2, x**3]\n",
    "print(f\"Peak to Peak range by column in Raw        X:{np.ptp(X,axis=0)}\")\n",
    "\n",
    "# add mean_normalization \n",
    "X = zscore_normalize_features(X)     \n",
    "print(f\"Peak to Peak range by column in Normalized X:{np.ptp(X,axis=0)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Now we can try again with a more aggressive value of alpha:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration         0, Cost: 9.42147e+03\n",
      "Iteration     10000, Cost: 3.90938e-01\n",
      "Iteration     20000, Cost: 2.78389e-02\n",
      "Iteration     30000, Cost: 1.98242e-03\n",
      "Iteration     40000, Cost: 1.41169e-04\n",
      "Iteration     50000, Cost: 1.00527e-05\n",
      "Iteration     60000, Cost: 7.15855e-07\n",
      "Iteration     70000, Cost: 5.09763e-08\n",
      "Iteration     80000, Cost: 3.63004e-09\n",
      "Iteration     90000, Cost: 2.58497e-10\n",
      "w,b found by gradient descent: w: [5.27e-05 1.13e+02 8.43e-05], b: 123.5000\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(0,20,1)\n",
    "y = x**2\n",
    "\n",
    "X = np.c_[x, x**2, x**3]\n",
    "X = zscore_normalize_features(X) \n",
    "\n",
    "model_w, model_b = run_gradient_descent_feng(X, y, iterations=100000, alpha=1e-1)\n",
    "\n",
    "plt.scatter(x, y, marker='x', c='r', label=\"Actual Value\"); plt.title(\"Normalized x x**2, x**3 feature\")\n",
    "plt.plot(x,X@model_w + model_b, label=\"Predicted Value\"); plt.xlabel(\"x\"); plt.ylabel(\"y\"); plt.legend(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Feature scaling allows this to converge much faster.   \n",
    "Note again the values of $\\mathbf{w}$. The $w_1$ term, which is the $x^2$ term is the most emphasized. Gradient descent has all but eliminated the $x^3$ term."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### Complex Functions\n",
    "With feature engineering, even quite complex functions can be modeled:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration         0, Cost: 2.20188e-01\n",
      "Iteration    100000, Cost: 1.70074e-02\n",
      "Iteration    200000, Cost: 1.27603e-02\n",
      "Iteration    300000, Cost: 9.73032e-03\n",
      "Iteration    400000, Cost: 7.56440e-03\n",
      "Iteration    500000, Cost: 6.01412e-03\n",
      "Iteration    600000, Cost: 4.90251e-03\n",
      "Iteration    700000, Cost: 4.10351e-03\n",
      "Iteration    800000, Cost: 3.52730e-03\n",
      "Iteration    900000, Cost: 3.10989e-03\n",
      "w,b found by gradient descent: w: [ -1.34 -10.    24.78   5.96 -12.49 -16.26  -9.51   0.59   8.7   11.94\n",
      "   9.27   0.79 -12.82], b: -0.0073\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(0,20,1)\n",
    "y = np.cos(x/2)\n",
    "\n",
    "X = np.c_[x, x**2, x**3,x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11, x**12, x**13]\n",
    "X = zscore_normalize_features(X) \n",
    "\n",
    "model_w,model_b = run_gradient_descent_feng(X, y, iterations=1000000, alpha = 1e-1)\n",
    "\n",
    "plt.scatter(x, y, marker='x', c='r', label=\"Actual Value\"); plt.title(\"Normalized x x**2, x**3 feature\")\n",
    "plt.plot(x,X@model_w + model_b, label=\"Predicted Value\"); plt.xlabel(\"x\"); plt.ylabel(\"y\"); plt.legend(); plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "\n",
    "## Congratulations!\n",
    "In this lab you:\n",
    "- learned how linear regression can model complex, even highly non-linear functions using feature engineering\n",
    "- recognized that it is important to apply feature scaling when doing feature engineering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  },
  "toc-autonumbering": false
 },
 "nbformat": 4,
 "nbformat_minor": 5
}